~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~ Walkthrough for:
~~ V4 Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 2471245.1)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This procedure apply on 11.2.0.4 or higher soure database.
The target database can be in higher version than source database (upgrade)

~~~~~~~~~~~~~~~~~~~~~~~~
~~ Source database setup
~~~~~~~~~~~~~~~~~~~~~~~~
initGREEDOPRD.ora:

db_name=GREEDO
instance_name=GREEDOPRD
db_unique_name=GREEDOPRD
compatible=11.2.0.0
control_files=(/data/GREEDOPRD/control01.ctl)
db_create_file_dest=/data
db_create_online_log_dest_1=/data
db_recovery_file_dest_size=4G
db_recovery_file_dest=/fra
log_archive_dest_1='location=USE_DB_RECOVERY_FILE_DEST'
log_archive_format=%t_%s_%r.arc
db_block_size=8192
open_cursors=300
diagnostic_dest=/app/oracle/base/admin/GREEDOPRD
sga_max_size=3G
sga_target=3G
pga_aggregate_target=512M
processes=350
audit_file_dest=/app/oracle/base/admin/GREEDOPRD/adump
audit_trail=db
remote_login_passwordfile=exclusive
undo_tablespace=UNDOTBS


-- tablespace setup
create tablespace TS1 datafile size 16M autoextend ON next 16M;
create tablespace TS2 datafile size 16M autoextend ON next 16M;
create tablespace TS3 datafile size 16M autoextend ON next 16M;

alter tablespace TS1 add datafile size 16M autoextend ON next 16M;
alter tablespace TS1 add datafile size 16M autoextend ON next 16M;
alter tablespace TS2 add datafile size 16M autoextend ON next 16M;
alter tablespace TS2 add datafile size 16M autoextend ON next 16M;
alter tablespace TS2 add datafile size 16M autoextend ON next 16M;

-- schema setup
grant connect, resource, unlimited tablespace to user1 identified by user1;
grant connect, resource, unlimited tablespace to user2 identified by user2;

grant create view to user1;
grant create view to user2;

create profile STANDARD_USER limit 
    SESSIONS_PER_USER          10
    CONNECT_TIME               30;

create profile VIP_USER limit 
    SESSIONS_PER_USER          20
    CONNECT_TIME               60;

alter user user1 profile STANDARD_USER;
alter user user2 profile VIP_USER;

-- schema contents setup
create table user1.tab1 as select * from dba_extents;
alter table user1.tab1 move tablespace TS1;
insert into user1.tab1 select * from user1.tab1;
insert into user1.tab1 select * from user1.tab1;
insert into user1.tab1 select * from user1.tab1;
commit;
insert into user1.tab1 select * from user1.tab1;
insert into user1.tab1 select * from user1.tab1;
commit;

create table user2.tab2 as select * from user1.tab1;
insert into user2.tab2 select * from user2.tab2;
commit;
insert into user2.tab2 select * from user2.tab2;
commit;

alter table user1.tab1 move tablespace TS2;

create index user1.ind1 on user1.tab1(blocks) tablespace TS3;
create index user2.ind2 on user2.tab2(blocks) tablespace TS3;

alter table user2.tab2 move tablespace TS2;
alter index user2.ind2 rebuild tablespace TS3;



create table user1.message(m varchar2(30), d date) tablespace TS3;
insert into user1.message values('Setup',sysdate);
commit;


grant select on v_$session to user1;
grant select on v_$tablespace to user2;

connect user1/user1
create view sess as select * from v$session;


connect user2/user2

create or replace procedure TSLIST
is
  cursor c_ts is select * from v$tablespace;
begin
  for r_ts in c_ts
  loop
    dbms_output.put_line( 'Tablespace: ' ||r_ts.name );
  end loop;
end;
/


-- check if the tablespaces are self_contained
SQL> exec sys.dbms_tts.transport_set_check(ts_list => 'TS1,TS2,TS3', incl_constraints => true);
SQL> Select * from transport_set_violations;

PL/SQL procedure successfully completed.

-- backup source database
run
{
  set nocfau;
  allocate channel ch01 device type disk format '/mnt/yavin4/tmp/_oracle_/orabackup/GREEDO/%d_%U_%s_%t.bck';
  allocate channel ch02 device type disk format '/mnt/yavin4/tmp/_oracle_/orabackup/GREEDO/%d_%U_%s_%t.bck';
  allocate channel ch03 device type disk format '/mnt/yavin4/tmp/_oracle_/orabackup/GREEDO/%d_%U_%s_%t.bck';
  allocate channel ch04 device type disk format '/mnt/yavin4/tmp/_oracle_/orabackup/GREEDO/%d_%U_%s_%t.bck';
  backup as compressed backupset incremental level 0 database include current controlfile plus archivelog delete input;
}


~~~~~~~~~~~~~~~~~~~~~~~~
~~ Target database setup
~~~~~~~~~~~~~~~~~~~~~~~~
initWEDGEPRD.ora:

db_name=WEDGE
instance_name=WEDGEPRD
db_unique_name=WEDGEPRD
compatible=19.0.0.0.0
control_files=(/data/WEDGEPRD/control01.ctl)
db_create_file_dest=/data
db_create_online_log_dest_1=/data
db_recovery_file_dest_size=4G
db_recovery_file_dest=/fra
log_archive_dest_1='location=USE_DB_RECOVERY_FILE_DEST'
log_archive_format=%t_%s_%r.arc
db_block_size=8192
open_cursors=300
diagnostic_dest=/app/oracle/base/admin/WEDGEPRD
sga_max_size=3G
sga_target=3G
pga_aggregate_target=512M
pga_aggregate_limit=2G
processes=350
audit_file_dest=/app/oracle/base/admin/WEDGEPRD/adump
audit_trail=db
remote_login_passwordfile=exclusive
undo_tablespace=TBS_UNDO


-- backup target database
run
{
  set nocfau;
  allocate channel ch01 device type disk format '/mnt/yavin4/tmp/_oracle_/orabackup/WEDGE/%d_%U_%s_%t.bck';
  allocate channel ch02 device type disk format '/mnt/yavin4/tmp/_oracle_/orabackup/WEDGE/%d_%U_%s_%t.bck';
  allocate channel ch03 device type disk format '/mnt/yavin4/tmp/_oracle_/orabackup/WEDGE/%d_%U_%s_%t.bck';
  allocate channel ch04 device type disk format '/mnt/yavin4/tmp/_oracle_/orabackup/WEDGE/%d_%U_%s_%t.bck';
  backup as compressed backupset incremental level 0 database include current controlfile plus archivelog delete input;
}


~~

-- downnload scripts (attached to note, currently: rman_xttconvert_VER4.3.zip) to source machine
-- unzip to a temporary location
-- edit xtt.properties file at least with mandatory filds: 

        tablespaces
        platformid
        src_scratch_location
        dest_scratch_location
        dest_datafile_location
        (if using 12c) -- usermantransport=1


-- get PLATFORM_ID for SOURCE and DESTINATION databases
SQL> select PLATFORM_ID from V$DATABASE;

-- once xtt.properties OK on source, copy to dest in $TEMPDIR

-- set TEMPDIR environement variable for BOTH machines:
export TMPDIR=/mnt/yavin4/tmp/_oracle_/tmp/TEMP_SOURCE_XTTCONVERT
export TMPDIR=/mnt/yavin4/tmp/_oracle_/tmp/TEMP_DEST_XTTCONVERT


-- Run the backup on the source system
cd $TMPDIR
$ORACLE_HOME/perl/bin/perl xttdriver.pl --backup


-- Restore the datafiles on the destination system
cd $TMPDIR
$ORACLE_HOME/perl/bin/perl xttdriver.pl --restore


-- Roll Forward Phase
-- as long as necessary perform backup/restore (incremental!) using previous commands

-- in order to trace, we add a new datafile and some data 

insert into user1.message values('Roll Forward Phase',sysdate);
commit;

alter tablespace TS2 add datafile size 8M autoextend ON next 8M;




-- Phase final Incremental Backup  
-- If you are running 12c, this step can be replaced by Phase 4 in Note 2005729.1

insert into user1.message values('Just before RO tablespaces',sysdate);

alter tablespace TS1 read only;
alter tablespace TS2 read only;
alter tablespace TS3 read only;

-- take final incremental backup ignoring errors like:
ORA-20001: TABLESPACE(S) IS READONLY OR,
OFFLINE JUST CONVERT, COPY
ORA-06512: at line 284

cd $TMPDIR
$ORACLE_HOME/perl/bin/perl xttdriver.pl --backup

-- restore final incremental backup on target database
cd $TMPDIR
$ORACLE_HOME/perl/bin/perl xttdriver.pl --restore


-- on source
------------
mkdir -p /mnt/yavin4/tmp/_oracle_/tmp/DATAPUMP_SOURCE_XTTCONVERT
SQL> create directory DPUMP_TTS as '/mnt/yavin4/tmp/_oracle_/tmp/DATAPUMP_SOURCE_XTTCONVERT';

cd /mnt/yavin4/tmp/_oracle_/tmp/DATAPUMP_SOURCE_XTTCONVERT

-- export metadata
expdp userid=system/secret  directory=DPUMP_TTS LOGFILE=metadata.log FULL=y INCLUDE=USER,ROLE,ROLE_GRANT,PROFILE dumpfile=metadata.dmp CONTENT=METADATA_ONLY

-- parfile exp.par:
dumpfile=xttdump.dmp
directory=DPUMP_TTS
statistics=NONE
transport_tablespaces=TS1,TS2,TS3
transport_full_check=y
logfile=tts_export.log

-- expdp en mode "transportable tablespace"
expdp userid=system/***** parfile=exp.par

-- copy dumpfiles from source to destination
cp /mnt/yavin4/tmp/_oracle_/tmp/DATAPUMP_SOURCE_XTTCONVERT/xttdump.dmp /mnt/yavin4/tmp/_oracle_/tmp/DATAPUMP_DEST_XTTCONVERT/

-- on target
------------
-- import metadata
impdp userid=system/secret directory=DPUMP_TTS dumpfile=metadata.dmp logfile=import_metadata.log remap_tablespace=TEMP:TMS_TEMP
-- import "transportable tablespace"
impdp userid=system/secret parfile=imp.par


~~~~~~~~~~~~~~
~~ Other links
~~~~~~~~~~~~~~
-- https://dbavivekdhiman.wordpress.com/2015/05/31/cross-platform-migration-from-aix-oracle-11-2-0-3-to-linux11-2-0-3/
-- 11G - Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 1389592.1)


